1 Introduction

Salbutamol is a short-acting beta-agonist (SABA) which acts on the smooth muscle surrounding the bronchi. By inhibiting smooth muscle contraction, it induces bronchodilation which relieves asthma symptoms(1). Salbutamol is the most commonly prescribed inhaler in Scotland

This report aims to investigate the trends regarding prescribing of salbutamol in Scotland in the year 2024. With a focus on variations across the different NHS Health Boards, and across different seasons throughout the year.

It is imortant to consider the influence of these factors on the prescribing of salbutamol, as

Across the NHS Health Boards, we would expect a greater number of total prescriptions in health boards with a greater overall population. If we look at data

First we load in data files for the prescriptions in each month of 2024. We also load in data for the NHS Health Boards:

data_jan_jun_2024 <- read_csv("https://www.opendata.nhs.scot/dataset/84393984-14e9-4b0d-a797-b288db64d088/resource/f0df380b-3f9b-4536-bb87-569e189b727a/download/hb_pitc2024_01_06-1.csv") %>% 
  clean_names()

data_jul_dec_2024 <- read_csv("https://www.opendata.nhs.scot/dataset/84393984-14e9-4b0d-a797-b288db64d088/resource/f3b9f2e2-66c0-4310-9b8e-734781d2ed0a/download/hb_pitc2024_07_12-1.csv") %>% 
  clean_names()

HB_lookup <- read_csv("https://www.opendata.nhs.scot/dataset/9f942fdb-e59e-44f5-b534-d6e17229cc7b/resource/652ff726-e676-4a20-abda-435b98dd7bdc/download/hb14_hb19.csv") %>% 
  clean_names()

combined_data_2024 <- bind_rows(data_jan_jun_2024, data_jul_dec_2024) %>% 
  clean_names() %>% 
  full_join(HB_lookup, by = c("hbt" = "hb")) %>% 
  select(hb_name, hbt:paid_date_month) %>% 
  filter(!is.na(hb_name))

NHS_healthboards <- st_read(here("data", "SG_NHS_HealthBoards_2019.shp"))
## Reading layer `SG_NHS_HealthBoards_2019' from data source 
##   `C:\Users\saimc\OneDrive\Documents\data-science\B249238\data\SG_NHS_HealthBoards_2019.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 14 features and 4 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 5512.998 ymin: 530250.8 xmax: 470332 ymax: 1220302
## Projected CRS: OSGB36 / British National Grid
population_data <- read_csv(here( "data", "UV102a_age_health_board_census.csv"), skip = 10) %>% 
  # Rename the last column to avoid the messy name in column 6
  # and to match column names with the prescription dataset
  rename(Spare = "...6",
         hb_name = "Health Board Area 2019",
         hb_population = Count) %>% 
  # filter the data so that we get the population of the entire health board
  filter(Age == "All people" & Sex == "All people") %>% 
  # select only the relevant columns
  select(hb_name, hb_population) %>% 
  # change health board names so they match the prescription data
  mutate(hb_name = paste("NHS", hb_name))
salbutamol_inhalers <- c("SALBUTAMOL", "AIROMIR", "ASMALAL", "SALAMOL", "SALBULIN", "VENTOLIN")

salbutamol_data <- combined_data_2024 %>% 
  filter(str_detect(bnf_item_description, paste(salbutamol_inhalers, collapse = "|")))

2 Results

All of the data files were used to produce the following results consisting of a summary table, line graphs and maps.

2.1 Summary Table

salbutamol_data_table <- population_data %>%
  full_join(salbutamol_data, 
            by = join_by(hb_name)) %>%
  group_by(hb_name, hb_population) %>% 
  summarise(
    number_of_paid_items = sum(number_of_paid_items), 
    paid_quantity = sum(paid_quantity),
    quantity_per_head = sum(paid_quantity)/mean(hb_population)
  ) %>% 
  ungroup() %>% 
  gt() %>% 
  tab_header(
    title = "Prescription of Salbutamol across NHS Health Boards"
  ) %>% 
  tab_source_note(
    source_note = "Source: ********"
  ) %>% 
  cols_label(
    hb_name = "Health Board",
    hb_population = "Health Board Population",
    number_of_paid_items = "Total Number of Paid Items",
    paid_quantity = "Total Paid Quantity",
    quantity_per_head = "Salbutamol Dispensed Per Person"
  ) %>% 
  opt_stylize()
salbutamol_data_table
Prescription of Salbutamol across NHS Health Boards
Health Board Health Board Population Total Number of Paid Items Salbutamol Dispensed Per Person
NHS Ayrshire and Arran 365256 185756 43075166 117.93144
NHS Borders 116821 54322 13283784 113.71058
NHS Dumfries and Galloway 145895 89894 20207703 138.50854
NHS Fife 371781 165797 45429068 122.19309
NHS Forth Valley 302784 129151 33998863 112.28752
NHS Grampian 581040 200258 47438608 81.64431
NHS Greater Glasgow and Clyde 1177213 607721 144018885 122.33885
NHS Highland 321321 134030 32197816 100.20452
NHS Lanarkshire 668027 367261 82929044 124.14026
NHS Lothian 904628 319072 80087331 88.53068
NHS Orkney 21958 6775 1546281 70.41994
NHS Shetland 22986 8118 1776140 77.27051
NHS Tayside 413992 173873 46495792 112.31085
NHS Western Isles 26140 13045 2957459 113.13921
Source: ********

2.2 Line graphs

seasonal_salbutamol_prescriptions <- salbutamol_data %>% 
  mutate(season = case_when(paid_date_month %in% c(202403, 202404, 202405) ~ "Spring", paid_date_month %in% c(202406, 202407, 202408) ~ "Summer", paid_date_month %in% c(202409, 202410, 202411) ~ "Autumn", paid_date_month %in% c(202412, 202401, 202402) ~ "Winter"), season = factor(season, levels = c("Spring", "Summer", "Autumn", "Winter"))) %>%
  group_by(hb_name, season) %>% 
  summarise(avg_paid_quantity = mean(paid_quantity, na.rm = TRUE))


line_graph <- ggplot(seasonal_salbutamol_prescriptions, aes(x = season, y = avg_paid_quantity, group = hb_name)) +
  geom_line(color = "darkgreen", linewidth = 1) +
  geom_point() +
  facet_wrap(~ hb_name, ncol = 3, scales = "free") +
  labs(x = "Season", y = "Average Quantity per Season", title = "Seasonal Salbutamol Prescribing by Health Board") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 10))

plotly::ggplotly(line_graph)

These graphs above show the variations in monthly prescribing of salbutamol throughout 2024 for each of the Health boards in Scotland

For the future, I plan to produce similar graphs for other beta-blockers and maybe also graphs for all beta-blockers combined. It might also be useful for me to include a summary table of prescribing of beta-blockers across health boards.

Regarding seasonal changes, I could divide the 12 months into 4 seasons (3 months data combined for total data for each season) but I need to investigate the best way to present the data across seasons.

If I end up having too many graphs, I might decide to only have graphs for data regarding all beta-blockers combined rather than specific beta-blockers like salbutamol.

2.3 Maps

salbutamol_data_hb <- NHS_healthboards %>%
  full_join(salbutamol_data, 
            by = join_by(HBCode == hbt)) %>% 
  filter(!is.na(HBName)) %>% 
  group_by(HBCode) %>% 
  summarise(paid_quantity = sum(paid_quantity))

map_salbutamol_data_hb <- salbutamol_data_hb %>%
  ggplot(aes(fill = paid_quantity)) +
  geom_sf(colour = "black", size = 0.1) +
  scale_fill_distiller(
    palette = "Blues", 
    direction = 1,  
    name = "No. of Prescriptions"
  ) +
  labs(
    title = "Total Number of Salbutamol Prescriptions", 
    subtitle = "Salbutamol Prescriptions by Health Board"
  ) +
  theme_void() +
  theme(
    plot.title = element_text(face = "bold", size = 16), 
    plot.subtitle = element_text(size = 8)
  )  

map_salbutamol_data_hb

3 Conclusions

Include Limitations of data and next steps (particularly in terms of data that would allow for further analysis)

However, there are some limitations in the data used in this report. For instance,

Regarding potential next steps, it would be useful

4 References

1.Marques L, Vale N. Salbutamol in the management of asthma: A review. International Journal of Molecular Sciences [Internet]. 2022;23(22). Available from: https://pmc.ncbi.nlm.nih.gov/articles/PMC9696300/